cpp 函数

  1. 笨拙的重复函数

  2. 函数指针

让“函数”变成变量,让行为“数据化”

#include <iostream>
int contMatchElements(int *beg, int *end, bool(*pred)(const int &)){
	int result = 0;
	for(;beg!=end;++beg){
		if(pred(*beg)) ++result;
	}
	return result;
}

bool isGreater20(const int  &val){ return val > 20;}
bool isGreater25(const int  &val){ return val > 25;}
bool isLess10(const int  &val){ return val < 10;}

int main(){
	int intArray[] = {11,16,21,19,17,30};
	ans = countMatchElements(intArray, intArray + 6, isGreater20);
	ans = countMatchElements(intArray, intArray + 6, isGreater25);
	ans = countMatchElements(intArray, intArray + 6, isLess10);
	
}
  1. 通过模板提高函数通用性

独立于类型的函数,可产生函数特定类型的版本

#include <iostream>
template<typename T>
int contMatchElements(T *beg, T *end, bool(*pred)(const T &)){
	int result = 0;
	for(;beg!=end;++beg){
		if(pred(*beg*)) ++result;
	}
	return result;
}

bool isGreater20(const int  &val){ return val > 20;}
bool isGreater25(const int  &val){ return val > 25;}
bool isLess10(const int  &val){ return val < 10;}
bool isTinyStr(const std::string &val){return val.size() <=3; }

int main(){
	int intArray[] = {11,16,21,19,17,30};
	std::string strArray[]={'aaaa','bbb','c','ddddddd','ffff','gg'}
	bool ans = countMatchElements(intArray, intArray + 6, isGreater20);
	bool ans = countMatchElements(intArray, intArray + 6, isGreater25);
	bool ans = countMatchElements(intArray, intArray + 6, isLess10);
	bool ans = countMatchElements(strArray, strArray + 6, isTinyStr);
}
  1. 仿函数(函数对象)

定义了调用操作符
行为类似函数的对象

#include <iostream>
template<typename T, typename Pred>
int contMatchElements(T *beg, T *end, Pred pred){
	int result = 0;
	for(;beg!=end;++beg){
		if(pred(*beg*)) ++result;
	}
	return result;
}
template<typename T>
struct Greater{
	T mVal; //持有的状态
	explicit Greater(T value): mVal(value){}//构造函数初始化mval
	bool operator()(const T &val) const{ return val> mVal;}//重载函数调用操作符
}

int main(){
	int intArray[] = {11,16,21,19,17,30};
	std::string strArray[]={'aaaa','bbb','c','ddddddd','ffff','gg'}
	Greater<int> greater20{20};
	Greater<std::string> longStr3{3};
	bool ans = countMatchElements(intArray, intArray + 6, greater20);
	bool ans = countMatchElements(strArray, strArray + 6, longStr3);
}
  1. lambda表达式——更加简洁
#include <iostream>
template<typename T, typename Pred>
int contMatchElements(T *beg, T *end, Pred pred){
	int result = 0;
	for(;beg!=end;++beg){
		if(pred(*beg)) ++result;
	}
	return result;
}
int main(){
	int intArray[] = {11,16,21,19,17,30};
	std::string strArray[]={'aaaa','bbb','c','ddddddd','ffff','gg'}
	auto greater20 = [](auto &val) -> bool {return val > 20;};
	auto isTinyStr = [](auto &val) -> bool {return val <=3;};
	bool ans = countMatchElements(intArray, intArray + 6, greater20);
	bool ans = countMatchElements(strArray, strArray + 6, isTinyStr);
}